/* 
 * --------------------------------------------------------------
 * This is the android keyboard handler class that implements key 
 * events listener.  
 * 2011, by Wu Mu Xian
 * --------------------------------------------------------------
*/

package mygame.myandroidgameframework;

import java.util.ArrayList;
import java.util.List;

import android.view.View;
import android.view.View.OnKeyListener;

import mygame.basicgameframework.Input.KeyEvent;
import mygame.basicgameframework.Pool;
import mygame.basicgameframework.Pool.PoolObjectFactory;


public class MyAndroidKeyboardHandler implements OnKeyListener {
	 
	boolean[] pressedKeys = new boolean[128]; // the status of the pressed keys
	Pool<KeyEvent> keyEventPool; // The key event pool
	// The key events buffer
	List<KeyEvent> keyEventsBuffer = new ArrayList<KeyEvent>();
	// The key events
	List<KeyEvent> keyEvents = new ArrayList<KeyEvent>();
	
	// The constructor
	public MyAndroidKeyboardHandler(View view) { 
        PoolObjectFactory<KeyEvent> factory = new PoolObjectFactory<KeyEvent>() { 
            public KeyEvent createObject() { 
                return new KeyEvent(); 
            } 
        }; 
        keyEventPool = new Pool<KeyEvent>(factory, 100); 
        view.setOnKeyListener(this); 
        view.setFocusableInTouchMode(true); 
        view.requestFocus(); 
    }

	// called when a key is pressed
	public boolean onKey(View v, int keyCode, android.view.KeyEvent event) {
		if (event.getAction() == android.view.KeyEvent.ACTION_MULTIPLE ) 
            return false; 
 
        synchronized (this) { 
            KeyEvent keyEvent = keyEventPool.newObject(); 
            keyEvent.keyCode = keyCode; 
            keyEvent.keyChar = (char) event.getUnicodeChar(); 
            if (event.getAction() == android.view.KeyEvent.ACTION_DOWN ) { 
                keyEvent.type = KeyEvent.KEY_DOWN ; 
                if(keyCode > 0 && keyCode < 127) 
                    pressedKeys[keyCode] = true; 
            } 
            if (event.getAction() == android.view.KeyEvent.ACTION_UP ) { 
                keyEvent.type = KeyEvent.KEY_UP ; 
                if(keyCode > 0 && keyCode < 127) 
                    pressedKeys[keyCode] = false; 
            } 
            keyEventsBuffer.add(keyEvent); 
        }
		return false;
	}
	
	// check if a key is pressed
	public boolean isKeyPressed(int keyCode) { 
        if (keyCode < 0 || keyCode > 127) 
            return false; 
        return pressedKeys[keyCode]; 
    }
	
	// get the key events
	public List<KeyEvent> getKeyEvents() { 
        synchronized (this) { 
            int len = keyEvents.size(); 
            for (int i = 0; i < len; i++) 
                keyEventPool.free(keyEvents.get(i)); 
            keyEvents.clear(); 
            keyEvents.addAll(keyEventsBuffer); 
            keyEventsBuffer.clear(); 
            return keyEvents; 
        } 
    }
}
